const fs = require('fs');
const path = require('path');
const https = require('https');
const {URL} = require('url');
// import debounce from 'lodash.debounce'
let successList;
const root = './src/',
    exts = ['.jpg', '.png'],
    max = 5200000, // 5MB == 5242848.754299136
    success = './tinySuccess.txt';

let successString = fs.readFileSync(success).toString();

fileList(root);
let count=0;
let timer;

const options = {
    method: 'POST',
    hostname: 'tinypng.com',
    path: '/web/shrink',
    headers: {
        rejectUnauthorized: false,
        'Postman-Token': Date.now(),
        'Cache-Control': 'no-cache',
        'Content-Type': 'application/x-www-form-urlencoded',
        'User-Agent':
            'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
    }
};

// 获取文件列表
function fileList(folder) {
    fs.readdir(folder, (err, files) => {
        if (err) {
            console.error(err);
        }
        files.forEach(file => {
            fileFilter(folder + file);
        });
    });
}

// 过滤文件格式，返回所有jpg,png图片
function fileFilter(file) {
    fs.stat(file, (err, stats) => {
        if (err) return console.error(err);
        if (
            // 必须是文件，小于5MB，后缀 jpg||png
            stats.size <= max &&
            stats.isFile() &&
            exts.includes(path.extname(file))
        ) {
            count++
            if (!~successString.indexOf(`${file}`.replace(root, ''))) {
                fileUpload(file); // console.log('可以压缩：' + file);
            }else{
                recordSuccess()
            }
        }
        if (stats.isDirectory()) fileList(file + '/');
    });
}

// 异步API,压缩图片
// {"error":"Bad request","message":"Request is invalid"}
// {"input": { "size": 887, "type": "image/png" },"output": { "size": 785, "type": "image/png", "width": 81, "height": 81, "ratio": 0.885, "url": "https://tinypng.com/web/output/7aztz90nq5p9545zch8gjzqg5ubdatd6" }}
function fileUpload(img) {
    var req = https.request(options, function (res) {
        res.on('data', buf => {
            let obj
            try {
                obj = JSON.parse(buf.toString());
            } catch (e) {
                recordSuccess(img);
                return
            }
            if (obj.error) {
                const timeout = parseInt(Math.random() * 2000);
                if (obj.error === 'Too many requests') {
                    setTimeout(function () {
                        fileUpload(img)
                    }, timeout)
                } else {
                    console.log(`[${img}]：压缩失败！报错：${obj.message}`);
                }
            } else {
                fileUpdate(img, obj);
            }
        });
    });
    req.write(fs.readFileSync(img), 'binary');

    req.on('error', e => {
        console.error(e);
    });
    req.end();
}

// 该方法被循环调用,请求图片数据
function fileUpdate(imgpath, obj) {
    if (obj.output.ratio < 0.8) {
        let options = new URL(obj.output.url);
        let req = https.request(options, res => {
            let body = '';
            res.setEncoding('binary');
            res.on('data', function (data) {
                body += data;
            });

            res.on('end', function () {
                fs.writeFile(imgpath, body, 'binary', err => {
                    if (err) {
                        return console.error(err);
                    }
                    recordSuccess(imgpath);
                    console.log(
                        `[${imgpath}] \n 压缩成功，原始大小-${obj.input.size}，压缩大小-${
                            obj.output.size
                            }，优化比例-${obj.output.ratio}`
                    );
                });
            });
        });
        req.on('error', e => {
            console.error(e);
        });
        req.end();
    } else {
        recordSuccess(imgpath)
    }
}

function recordSuccess(imgpath) {
    if(imgpath){
        successString += (imgpath.replace(root, ',\n'));
    }
    timer && clearTimeout(timer)
    timer = setTimeout(function () {
        fs.writeFile(success, successString, err => {
            console.log(`压缩完成：${successString.split(',\n').length}/${count}`)
        })
    }, 5000)
}
